#include<bits/stdc++.h>
using namespace std;
int t,n,m,L,d,v,a,V,p,rr=0,ans1=0,ans2=0;
struct overtime{
	int l=100000000,r=100000000;
};
struct point{
	int si=0,nu;
};
bool cmp1(overtime a,overtime b){
	if(a.l==b.l) return a.r<b.r;
	else return a.l<b.l;
}
bool cmp2(point a,point b){
	return a.si>b.si;
}
int main(){
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	cin>>t;
	for(int i=0;i<t;i++){
		rr=0;ans1=0;ans2=0;
		cin>>n>>m>>L>>V;
		overtime num[n+1];
		for(int j=0;j<n;j++){
			cin>>d>>v>>a;
			if(a==0){
				if(v>V){
					num[rr].l=d;
					num[rr].r=L;
					//cout<<num[rr].l<<' '<<num[rr].r<<endl;
					rr++;
				}
			}
			else if(a<0){
				if(v>V){
					num[rr].l=d;
					num[rr].r=min(L,(v*v-V*V)/(2*(-a))+d);
					//cout<<num[rr].l<<' '<<num[rr].r<<endl;
					rr++;
				}
			}
			else{
				if(v<V){
					if(((V*V-v*v)/(2*a)+1+d)<=L){
						num[rr].l=(V*V-v*v)/(2*a)+1+d;
						num[rr].r=L;
						//cout<<num[rr].l<<' '<<num[rr].r<<endl;
						rr++;
					}
				}
				else{
					if(v>V){
						num[rr].l=d;
					}
					else{
						num[rr].l=d+1;
					}
					num[rr].r=L;
					//cout<<num[rr].l<<' '<<num[rr].r<<endl;
					rr++;
				}
			}
		}
		sort(num,num+n,cmp1);
	//	for(int j=0;j<rr;j++){
	//		cout<<num[j].l<<' '<<num[j].r<<endl;
	//	}
		vector<int>po[m+1];
		bool car[rr];
		memset(car,0,sizeof(car));
		point po2[m];
		for(int j=0;j<m;j++){
			cin>>p;
			po2[j].nu=j;
			for(int k=0;k<m;k++){
				if(num[k].l>p) break;
				if(num[k].r>=p){
					po[j].push_back(k);
					po2[j].si++;
				}
			}
		}
		sort(po2,po2+m,cmp2);
		for(int j=0;j<m;j++){
			int q=po2[j].nu;
			int con=1;
			for(int ii=0;ii<po2[j].si;ii++){
				if(car[po[q][ii]]==0){
					car[po[q][ii]]=1;
					ans1++;
					con=0;
				}
			}
			ans2+=con;
		}
		cout<<ans1<<' '<<ans2<<endl;
	}
	return 0;
}
